// 实现对象深拷贝
const testObject = (obj) => (typeof obj === 'object' || typeof obj === 'function') && obj !== null

const objectClone = (obj) => {
  // 检测是否是对象 并 不为null
  if (!testObject(obj)) {
    // 抛出错误
    throw new Error('参数不合规范')
  }

  // 如果参数为数组，则复制数组各元素，否则复制对象各属性
  const newObject = Array.isArray(obj) ? [...obj] : { ...obj }

  // 遍历对象每一个属性，如果该属性又为对象则产生递归
  Object.keys(newObject).forEach((key) => {
    if (testObject(newObject[key])) {
      newObject[key] = objectClone(newObject[key])
    }
  })

  return newObject
}

// 仅为简易版
// 推荐使用 lodash.cloneDeep()
export default objectClone
